package interpreter

import (
	"log"
	"strconv"
	"strings"
)

type Node interface {
	Interpret() int
}
type ValNode struct {
	val int
}

func (n *ValNode) Interpret() int {
	return n.val
}

type AddNode struct {
	left, right Node
}

func (n *AddNode) Interpret() int {
	return n.left.Interpret() + n.right.Interpret()
}

type MinNode struct {
	left, right Node
}

func (n *MinNode) Interpret() int {
	return n.left.Interpret() - n.right.Interpret()
}

type Parse struct {
	exp   []string
	index int
	prev  Node
}

func (p *Parse) Parse(exp string) {
	p.exp = strings.Split(exp, " ")
	log.Printf("p.exp: %s", p.exp)
	for {
		if p.index >= len(p.exp) {
			return
		}
		log.Printf("%+v", p.prev)
		switch p.exp[p.index] {
		case "+":
			p.prev = p.newAddNode()
		case "-":
			p.prev = p.newMinNode()
		default:
			p.prev = p.newValNode()

		}
	}
}
func (p *Parse) newAddNode() Node {
	p.index++
	return &AddNode{
		left:  p.prev,
		right: p.newValNode(),
	}
}
func (p *Parse) newMinNode() Node {
	p.index++
	return &MinNode{
		left:  p.prev,
		right: p.newValNode(),
	}
}
func (p *Parse) newValNode() Node {
	v, _ := strconv.Atoi(p.exp[p.index])
	p.index++
	return &ValNode{
		val: v,
	}
}
func (p *Parse) Result() Node {
	return p.prev
}

//可以非常的穷签名使用这种方式
// prev Node
// index int
// exp
// exp va;linode
// left
// min
// p.pre = val
// p.pre = p.pre val + in =
// p.pre = p.pre + val + p.pre va; +onm
// p.pre = p.,newmad
// new.ad
// p.pre shangyige
// p.pre
// p.pire
// p.re
// pr
//出来和进去的处理方式
// p.pre
// p.pre -  +  =
// p.pre =
// p.pre = va;
// p.pre = p.pre(val) + bewnbale
// p.pre = p.pre(ba;+) b+
// p.pre = p.pre+
// 1+3+4+4
